//===-- DeclXML.def - Metadata about Decl XML nodes ------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
//  This file defines the XML statement database structure as written in 
//  <TranslationUnit> sub-nodes of the XML document. 
//  The semantics of the attributes and enums are mostly self-documenting
//  by looking at the appropriate internally used functions and values.
//  The following macros are used:
//
//  NODE_XML( CLASS, NAME ) - A node of name NAME denotes a concrete 
//  statement of class CLASS where CLASS is a class name used internally by clang. 
//  After a NODE_XML the definition of all (optional) attributes of that statement 
//  node and possible sub-nodes follows.
//
//  END_NODE_XML - Closes the attribute definition of the current node.
//
//  ID_ATTRIBUTE_XML - Some statement nodes have an "id" attribute containing a 
//  string, which value uniquely identify that statement. Other nodes may refer 
//  by reference attributes to this value (currently used only for Label).
//
//  TYPE_ATTRIBUTE_XML( FN ) - Type nodes refer to the result type id of an
//  expression by a "type" attribute. FN is internally used by clang.
// 
//  ATTRIBUTE_XML( FN, NAME ) - An attribute named NAME. FN is internally 
//  used by clang. A boolean attribute have the values "0" or "1".
//
//  ATTRIBUTE_SPECIAL_XML( FN, NAME ) - An attribute named NAME which deserves 
//  a special handling. See the appropriate documentations. 
//
//  ATTRIBUTE_FILE_LOCATION_XML - A bunch of attributes denoting the location of
//  a statement in the source file(s).
//
//  ATTRIBUTE_OPT_XML( FN, NAME ) - An optional attribute named NAME. 
//  Optional attributes are omitted for boolean types, if the value is false, 
//  for integral types, if the value is null and for strings, 
//  if the value is the empty string. FN is internally used by clang.
//
//  ATTRIBUTE_ENUM[_OPT]_XML( FN, NAME ) - An attribute named NAME. The value
//  is an enumeration defined with ENUM_XML macros immediately following after 
//  that macro. An optional attribute is ommited, if the particular enum is the 
//  empty string. FN is internally used by clang.
//  
//  ENUM_XML( VALUE, NAME ) - An enumeration element named NAME. VALUE is 
//  internally used by clang.
//
//  END_ENUM_XML - Closes the enumeration definition of the current attribute.
//
//  SUB_NODE_XML( CLASS ) - A mandatory sub-node of class CLASS or its sub-classes.
//
//  SUB_NODE_OPT_XML( CLASS ) - An optional sub-node of class CLASS or its sub-classes.
//
//  SUB_NODE_SEQUENCE_XML( CLASS ) - Zero or more sub-nodes of class CLASS or 
//  its sub-classes.
//
//===----------------------------------------------------------------------===//

#ifndef ATTRIBUTE_FILE_LOCATION_XML
#  define ATTRIBUTE_FILE_LOCATION_XML             \
     ATTRIBUTE_XML(getFilename(), "file")         \
     ATTRIBUTE_XML(getLine(), "line")             \
     ATTRIBUTE_XML(getColumn(), "col")            \
     ATTRIBUTE_OPT_XML(getFilename(), "endfile")  \
     ATTRIBUTE_OPT_XML(getLine(), "endline")      \
     ATTRIBUTE_OPT_XML(getColumn(), "endcol")
#endif

#ifndef TYPE_ATTRIBUTE_XML
#  define TYPE_ATTRIBUTE_XML( FN )    ATTRIBUTE_XML(FN, "type")
#endif

#ifndef CONTEXT_ATTRIBUTE_XML
#  define CONTEXT_ATTRIBUTE_XML( FN ) ATTRIBUTE_XML(FN, "context")
#endif

//NODE_XML(TranslationUnitDecl, "TranslationUnit")
//  SUB_NODE_SEQUENCE_XML(Decl)
//END_NODE_XML

NODE_XML(Decl, "FIXME_Decl")
  ATTRIBUTE_FILE_LOCATION_XML
END_NODE_XML

NODE_XML(FunctionDecl, "Function")
  ID_ATTRIBUTE_XML
  ATTRIBUTE_FILE_LOCATION_XML
  ATTRIBUTE_XML(getDeclContext(), "context")
  ATTRIBUTE_XML(getNameAsString(), "name")
  TYPE_ATTRIBUTE_XML(getType()->getAsFunctionType()->getResultType())
  ATTRIBUTE_XML(getType()->getAsFunctionType(), "function_type")
  ATTRIBUTE_ENUM_OPT_XML(getStorageClass(), "storage_class")
	  ENUM_XML(FunctionDecl::None, "")
	  ENUM_XML(FunctionDecl::Extern, "extern")
	  ENUM_XML(FunctionDecl::Static, "static")
	  ENUM_XML(FunctionDecl::PrivateExtern, "__private_extern__")
  END_ENUM_XML
  ATTRIBUTE_OPT_XML(isInline(), "inline")
  //ATTRIBUTE_OPT_XML(isVariadic(), "variadic")       // in the type reference
  ATTRIBUTE_XML(getNumParams(), "num_args")
  SUB_NODE_SEQUENCE_XML(ParmVarDecl)
  //SUB_NODE_OPT_XML("Body")
END_NODE_XML

NODE_XML(CXXMethodDecl, "CXXMethodDecl")
  ID_ATTRIBUTE_XML
  ATTRIBUTE_FILE_LOCATION_XML
  ATTRIBUTE_XML(getDeclContext(), "context")
  ATTRIBUTE_XML(getNameAsString(), "name")
  TYPE_ATTRIBUTE_XML(getType()->getAsFunctionType()->getResultType())
  ATTRIBUTE_XML(getType()->getAsFunctionType(), "function_type")
  ATTRIBUTE_OPT_XML(isInline(), "inline")
  ATTRIBUTE_OPT_XML(isStatic(), "static")       
  ATTRIBUTE_OPT_XML(isVirtual(), "virtual")       
  ATTRIBUTE_XML(getNumParams(), "num_args")
  SUB_NODE_SEQUENCE_XML(ParmVarDecl)
  //SUB_NODE_OPT_XML("Body")
END_NODE_XML

//NODE_XML("Body")
//  SUB_NODE_XML(Stmt)
//END_NODE_XML
  
NODE_XML(NamespaceDecl, "Namespace")
  ID_ATTRIBUTE_XML
  ATTRIBUTE_FILE_LOCATION_XML
  ATTRIBUTE_XML(getDeclContext(), "context")
  ATTRIBUTE_XML(getNameAsString(), "name")
END_NODE_XML

NODE_XML(UsingDirectiveDecl, "UsingDirective")
  ATTRIBUTE_FILE_LOCATION_XML
  ATTRIBUTE_XML(getDeclContext(), "context")
  ATTRIBUTE_XML(getNameAsString(), "name")
  ATTRIBUTE_XML(getNominatedNamespace(), "ref")
END_NODE_XML

NODE_XML(NamespaceAliasDecl, "NamespaceAlias")
  ATTRIBUTE_FILE_LOCATION_XML
  ATTRIBUTE_XML(getDeclContext(), "context")
  ATTRIBUTE_XML(getNameAsString(), "name")
  ATTRIBUTE_XML(getNamespace(), "ref")
END_NODE_XML

NODE_XML(RecordDecl, "Record")
  ID_ATTRIBUTE_XML
  ATTRIBUTE_FILE_LOCATION_XML
  ATTRIBUTE_XML(getDeclContext(), "context")
  ATTRIBUTE_XML(getNameAsString(), "name")
  ATTRIBUTE_OPT_XML(isDefinition() == false, "forward")
  ATTRIBUTE_XML(getTypeForDecl(), "type")             // refers to the type this decl creates 
  SUB_NODE_SEQUENCE_XML(FieldDecl)
END_NODE_XML

NODE_XML(EnumDecl, "Enum")
  ID_ATTRIBUTE_XML
  ATTRIBUTE_FILE_LOCATION_XML
  ATTRIBUTE_XML(getDeclContext(), "context")
  ATTRIBUTE_XML(getNameAsString(), "name")
  ATTRIBUTE_OPT_XML(isDefinition() == false, "forward")
  ATTRIBUTE_SPECIAL_XML(getIntegerType(), "type")     // is NULL in pure declarations thus deserves special handling 
  SUB_NODE_SEQUENCE_XML(EnumConstantDecl)             // only present in definition
END_NODE_XML

NODE_XML(EnumConstantDecl, "EnumConstant")
  ID_ATTRIBUTE_XML
  ATTRIBUTE_FILE_LOCATION_XML
  ATTRIBUTE_XML(getDeclContext(), "context")
  ATTRIBUTE_XML(getNameAsString(), "name")
  TYPE_ATTRIBUTE_XML(getType())
  ATTRIBUTE_XML(getInitVal().toString(10, true), "value")     // integer
  SUB_NODE_OPT_XML(Expr)                                      // init expr of this constant
END_NODE_XML

NODE_XML(FieldDecl, "Field")
  ID_ATTRIBUTE_XML
  ATTRIBUTE_FILE_LOCATION_XML
  ATTRIBUTE_XML(getDeclContext(), "context")
  ATTRIBUTE_XML(getNameAsString(), "name")
  TYPE_ATTRIBUTE_XML(getType())
  ATTRIBUTE_OPT_XML(isMutable(), "mutable")
  ATTRIBUTE_OPT_XML(isBitField(), "bitfield")
  SUB_NODE_OPT_XML(Expr)                                      // init expr of a bit field
END_NODE_XML

NODE_XML(TypedefDecl, "Typedef")
  ID_ATTRIBUTE_XML
  ATTRIBUTE_FILE_LOCATION_XML
  ATTRIBUTE_XML(getDeclContext(), "context")
  ATTRIBUTE_XML(getNameAsString(), "name")
  TYPE_ATTRIBUTE_XML(getUnderlyingType())
END_NODE_XML

NODE_XML(VarDecl, "Var")
  ID_ATTRIBUTE_XML
  ATTRIBUTE_FILE_LOCATION_XML
  ATTRIBUTE_XML(getDeclContext(), "context")
  ATTRIBUTE_XML(getNameAsString(), "name")
  TYPE_ATTRIBUTE_XML(getType())
  ATTRIBUTE_ENUM_OPT_XML(getStorageClass(), "storage_class")
	  ENUM_XML(VarDecl::None, "")
	  ENUM_XML(VarDecl::Auto, "auto")
	  ENUM_XML(VarDecl::Register, "register")
	  ENUM_XML(VarDecl::Extern, "extern")
	  ENUM_XML(VarDecl::Static, "static")
	  ENUM_XML(VarDecl::PrivateExtern, "__private_extern__")
  END_ENUM_XML
  SUB_NODE_OPT_XML(Expr)                                      // init expr 
END_NODE_XML

NODE_XML(ParmVarDecl, "ParmVar")
  ID_ATTRIBUTE_XML
  ATTRIBUTE_FILE_LOCATION_XML
  ATTRIBUTE_XML(getDeclContext(), "context")
  ATTRIBUTE_XML(getNameAsString(), "name")
  TYPE_ATTRIBUTE_XML(getType())
  SUB_NODE_OPT_XML(Expr)                                      // default argument expression 
END_NODE_XML

NODE_XML(LinkageSpecDecl, "LinkageSpec")
  ID_ATTRIBUTE_XML
  ATTRIBUTE_FILE_LOCATION_XML
  ATTRIBUTE_XML(getDeclContext(), "context")
  ATTRIBUTE_ENUM_OPT_XML(getLanguage(), "lang")
	  ENUM_XML(LinkageSpecDecl::lang_c, "C")
	  ENUM_XML(LinkageSpecDecl::lang_cxx, "CXX")
  END_ENUM_XML
END_NODE_XML


//===----------------------------------------------------------------------===//
#undef NODE_XML
#undef ID_ATTRIBUTE_XML                
#undef TYPE_ATTRIBUTE_XML
#undef ATTRIBUTE_XML
#undef ATTRIBUTE_SPECIAL_XML
#undef ATTRIBUTE_OPT_XML
#undef ATTRIBUTE_ENUM_XML
#undef ATTRIBUTE_ENUM_OPT_XML
#undef ATTRIBUTE_FILE_LOCATION_XML
#undef ENUM_XML
#undef END_ENUM_XML                    
#undef END_NODE_XML                    
#undef SUB_NODE_XML
#undef SUB_NODE_SEQUENCE_XML
#undef SUB_NODE_OPT_XML
